import pandas as pd
from pandas.core.interchange.dataframe_protocol import DataFrame

from tools import read_specific_columns
from tools import BASE_PATH_5G生态应用技术

pd.set_option('display.unicode.east_asian_width', True)

stu_names_path = f"{BASE_PATH_5G生态应用技术}/学生名单.xlsx"


def get_上机_签到(上机='上机1') -> DataFrame:
    file_path = f"{BASE_PATH_5G生态应用技术}/考勤_{上机}.xlsx"

    # 为特定列指定默认值
    converters = {
        '学号': lambda x: int(x) if str(x).strip() not in ["N/A", ""] else 0,
    }

    # 注意：索引从0开始，所以第1列索引0
    selected_df = read_specific_columns(
        file_path=file_path,
        columns=['学号', '状态'],
        dtype={'学号': int, '最终成绩': str},
        header_row=1,
        converters=converters
    )

    # 显示读取的数据
    print("\n读取的数据:")
    print(selected_df)
    return selected_df


def get_学生_信息() -> DataFrame:
    # 为特定列指定默认值
    converters = {
        '学号': lambda x: int(x) if str(x).strip() not in ["N/A", ""] else 0,
    }

    # 注意：索引从0开始，所以第1列索引0
    selected_df = read_specific_columns(
        file_path=stu_names_path,
        columns=['学号', '姓名'],
        dtype={'学号': int, '姓名': str},
        header_row=0,
        converters=converters
    )

    # 显示读取的数据
    print("\n读取的数据:")
    print(selected_df)
    return selected_df


def merge_student_homeworks(df_stu_info, homework_dfs, output_path=None,
                            id_col='学号', name_col='姓名',
                            fill_value=0, validate_names=True):
    """
    合并多个学生作业成绩DataFrame

    参数:
        df_stu_info (pd.DataFrame): 学生信息DataFrame（包含完整学生名单）
        homework_dfs (list): 作业成绩DataFrame列表，每个包含学号、姓名和作业成绩列
        output_path (str): 输出Excel文件路径（可选）
        id_col (str): 学号列名（默认为'学号'）
        name_col (str): 姓名列名（默认为'姓名'）
        fill_value: 缺失值填充值（默认为0）
        validate_names: 是否验证姓名一致性

    返回:
        pd.DataFrame: 合并后的DataFrame，包含学号、姓名和所有作业成绩
    """
    try:
        # 验证输入DataFrame
        if id_col not in df_stu_info.columns:
            raise ValueError(f"学生信息DataFrame中缺少学号列: {id_col}")
        if name_col not in df_stu_info.columns:
            raise ValueError(f"学生信息DataFrame中缺少姓名列: {name_col}")

        # 1. 创建基础合并DataFrame（只包含学号和姓名）
        merged_df = df_stu_info[[id_col, name_col]].copy()

        # 2. 遍历所有作业DataFrame
        for i, df_homework in enumerate(homework_dfs, 1):
            # 验证当前作业DataFrame
            if id_col not in df_homework.columns:
                raise ValueError(f"作业{i}DataFrame中缺少学号列: {id_col}")

            # 获取考勤成绩列名（假设是除了学号和姓名外的第一列）
            possible_score_cols = [col for col in df_homework.columns
                                   if col not in [id_col, name_col]]

            if not possible_score_cols:
                raise ValueError(f"考勤{i}DataFrame中没有找到成绩列")

            # 使用第一个可能的成绩列
            score_col = possible_score_cols[0]
            new_col_name = f"考勤{i}"

            # 选择并重命名成绩列
            df_homework_selected = df_homework[[id_col, score_col]].rename(
                columns={score_col: new_col_name}
            )

            # 合并当前作业成绩
            merged_df = pd.merge(
                merged_df,
                df_homework_selected,
                on=id_col,
                how='left'
            )

            # 填充缺失成绩
            merged_df[new_col_name] = merged_df[new_col_name].fillna(fill_value)

            print(f"✅ 已合并出勤{i}数据")

        # 3. 如果需要，保存到Excel
        if output_path:
            merged_df.to_excel(output_path, index=False)
            print(f"\n✅ 所有出勤合并完成! 文件已保存至: {output_path}")

        return merged_df

    except Exception as e:
        print(f"❌ 合并失败: {str(e)}")
        raise


# 使用示例
if __name__ == "__main__":
    df_学生_信息 = get_学生_信息()
    df_上机1 = get_上机_签到('上机1')
    df_上机2 = get_上机_签到('上机2')
    df_上机3 = get_上机_签到('上机3')
    df_上机4 = get_上机_签到('上机4')

    # 所有作业列表
    all_homeworks = [df_上机1, df_上机2, df_上机3, df_上机4]

    print("学生信息:")
    print(df_学生_信息)

    # 合并所有作业
    merged_data = merge_student_homeworks(
        df_stu_info=df_学生_信息,
        homework_dfs=all_homeworks,
        output_path=f"{BASE_PATH_5G生态应用技术}/上机签到_汇总.xlsx",
        fill_value=-1,  # 用-1表示缺失成绩
        validate_names=True
    )

    print("\n合并后的数据:")
    print(merged_data)
